package test;

import org.junit.jupiter.api.Test;

public class 匿名内部类 {
	//匿名内部类--用这个匿名的类实例化出一个对象
	//语法格式规则
	//new AAA(){}
	//AAA=上级文件名
	//匿名内部类必须继承一个父类或实现了一个接口(只能有一个)
	
	Comparable<PersonBean> p1 = new Comparable<PersonBean>() {
		//new后面的是匿名内部类要实现的
		//大括号中放的是：匿名内部类体当中要写的代码
		@Override
		public int compareTo(PersonBean o) {
			// TODO Auto-generated method stub
			return 0;
		}
	};
}
class PersonBean implements Comparable<PersonBean>{
	@Override
	public int compareTo(PersonBean o) {
		return 0;
	}
}
/**
 * 		匿名内部类可以使你的代码更加简洁，你可以在定义一个类的同时
 * 对其进行实例化。它与局部类很相似，不同的是它没有类名，如果某个局部
 * 类你只需要用一次，那么你就可以使用匿名内部类。
 * 
 * */
/*
 * 通俗理解：
 * 已经定义了一个英语类，但由于其他的诸如法语、俄语等类都只需要使用一次，
 * 所以直接利用向上自动转型，顶一个出一个法语的对象，指向英语类，然后使用
 * 大括号直接在此对象的内部进行类似类的定义过程，此过程就成文匿名内部类的定义
 * .
 * */

//用局部类来初始化变量englishGreeting
//用匿类来初始化变量frenchGreeting和spanishGreeting
//
class HelloWorldAnonymousClasses {

    /**
     * 包含两个方法的HelloWorld接口
     */
    interface HelloWorld {
        public void greet();
        public void greetSomeone(String someone);
    }

    public void sayHello() {

        // 1、局部类EnglishGreeting实现了HelloWorld接口
        class EnglishGreeting implements HelloWorld {
            String name = "world";
            public void greet() {
                greetSomeone("world");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Hello " + name);
            }
        }

        HelloWorld englishGreeting = new EnglishGreeting();
        // 2、匿名类实现HelloWorld接口
        HelloWorld frenchGreeting = new HelloWorld() {
            String name = "tout le monde";
            public void greet() {
                greetSomeone("tout le monde");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Salut " + name);
            }
        };

        // 3、匿名类实现HelloWorld接口
        HelloWorld spanishGreeting = new HelloWorld() {
            String name = "mundo";
            public void greet() {
                greetSomeone("mundo");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Hola, " + name);
            }
        };

        englishGreeting.greet();
        frenchGreeting.greetSomeone("Fred");
        spanishGreeting.greet();
    }
    @Test
     public void mainn() {
        HelloWorldAnonymousClasses myApp = new HelloWorldAnonymousClasses();
        myApp.sayHello();
    }
}

/**
 * 	匿名内部类的语法：
 *  1. 操作符：new；
	2. 一个要实现的接口或要继承的类，案例一中的匿名类实现了HellowWorld接口，案例二中的匿名内部类继承了Animal父类；
	3. 一对括号，如果是匿名子类，与实例化普通类的语法类似，如果有构造参数，要带上构造参数；如果是实现一个接口，只需要一对空括号即可；
	4. 一段被"{}"括起来类声明主体；
	5. 末尾的";"号（因为匿名类的声明是一个表达式，是语句的一部分，因此要以分号结尾）。
	 * HelloWorld frenchGreeting = new HelloWorld() {
	   String name = "tout le monde";
	   public void greet() {
	         greetSomeone("tout le monde");
	   }
	   public void greetSomeone(String someone) {
	        name = someone;
	        System.out.println("Salut " + name);
	   }
	 };
 * */